﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Security.Helpers;
using Security.Specs.Common;

namespace Security.View.Helpers
{
    /// <summary>
    /// Предоставляет возможности по оповещению пользователя об ошибках
    /// </summary>
    public static class ErrorsViewHelper
    {
        /// <summary>
        /// Показывает поьзователю диалог с предупреждениями из <see cref="ErrorCollection"/> , 
        /// в котором он может выбрать игнорировать их или нет
        /// </summary>
        /// <returns>Если пользователь выбрал пункт игнорировать предупреждения то возвращается true</returns>
        public static bool ShowWarningMessages(ErrorCollection errors)
        {
            var hasWarnings = errors.Count(ErrorSeverity.Warning) > 0;
            if (hasWarnings)
            {
                bool ignoreWarnings = Services.Warning(Strings.GetIgnoreWarningNotification(errors.GetFormattedErrors(ErrorSeverity.Warning)));
                hasWarnings = !ignoreWarnings;
            }

            return hasWarnings;
        }

        /// <summary>
        /// Показывает пользователю информационное сообщения из <see cref="ErrorCollection"/> 
        /// </summary>
        public static void ShowInfoMessages(ErrorCollection errors)
        {
            var hasInfoMessages = errors.Count(ErrorSeverity.Info) > 0;
            if (hasInfoMessages)
            {
                Services.Info(Strings.GetInfoNotification(errors.GetFormattedErrors(ErrorSeverity.Info)));
            }
        }

        /// <summary>
        /// Показывает пользователю информационное сообщения из <see cref="ErrorCollection"/> 
        /// </summary>
        public static void ShowErrorMessages(ErrorCollection errors)
        {
            var hasInfoMessages = errors.Count(ErrorSeverity.Error) > 0;
            if (hasInfoMessages)
            {
                Services.Error(Strings.GetErrorNotification(errors.GetFormattedErrors(ErrorSeverity.Error)));
            }
        }

        /// <summary>
        /// Обьединяет <see cref="ShowWarningMessages"/> и <see cref="ShowInfoMessages"/>
        /// </summary>
        /// <returns>Если в коллекции были предупреждения и пользователь нажал игнорировать их то возвращает true
        /// в противном случае fsle. Если предупрежений небыло то всегда возвращает true</returns>
        public static bool ShowMessages(ErrorCollection errors)
        {
            var warningMessage = errors.GetFormattedErrors(ErrorSeverity.Warning);
            var hasWarnings = warningMessage.Trim().Length > 0;
            var infoMessage = errors.GetFormattedErrors(ErrorSeverity.Info);
            bool hasInfos = infoMessage.Trim().Length > 0;
            if (hasWarnings)
            {
                return Services.Warning(string.Concat(Strings.GetIgnoreWarningNotification(warningMessage), Environment.NewLine, Strings.GetInfoNotification(infoMessage)));
            }
            else if(hasInfos)
            {
                Services.Info(Strings.GetInfoNotification(infoMessage));
            }
            return true;
        }

        /// <summary>
        /// Оповещает пользователя об ошибках предупреждениях и прочей информации
        /// И запршивает у него разрешение на игнорирование предупреждений.
        /// </summary>
        /// <returns>Если в <see cref="ErrorCollection"/> содержатся ошибки с <see cref="ErrorSeverity.Error"/>
        /// то всегда возвращает false. Если нет ошибок и есть предупреждения то запрашивает у пользователя следует ли их  игнорировать если да то возвращает true если нет то возвращает false.
        /// Если нет ни ошибок не предупреждений то показывает пользователю информацию и возвращает true. Если нет информационных сообщений то возвращает true</returns>
        public static bool NotifyAndReturnUserResult(ErrorCollection errors)
        {
            var hasErrors = errors.Count(ErrorSeverity.Error) > 0;
            var ignoreWarnings = ShowMessages(errors);

            return !hasErrors && ignoreWarnings;
        }
    }
}
